/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Controller;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.File;
import java.io.IOException;
import Model.Congreso; 
import Model.Cliente; 
import Model.Gasto;
import Model.Pedido;
import Servicio.Facade;
import java.util.ArrayList;
/**
 *
 * @author javiten
 */
public class BaseDeDatosController {
    private ArrayList<Congreso> mCongresosNuevos;
    private ArrayList<Cliente> mClientesNuevos;
    private ArrayList<Cliente> mClientesViejos;
    private ArrayList<Pedido> mPedidosNuevos;
    private ArrayList<Pedido> mPedidosViejos;
    private ArrayList<Congreso> mCongresosViejos;
    
    
public BaseDeDatosController(){
    mCongresosNuevos = new ArrayList();
    mCongresosViejos = new ArrayList();
    mClientesNuevos = new ArrayList();
    mClientesViejos = new ArrayList();
    mPedidosNuevos = new ArrayList();
    mPedidosViejos = new ArrayList();
}

public ArrayList<Congreso> getCongresosNuevos () {
        return mCongresosNuevos;
    }

public void setCongresosNuevos (ArrayList<Congreso> val) {
        this.mCongresosNuevos = val;
    }

public ArrayList<Congreso> getCongresosViejos () {
        return mCongresosViejos;
    }

public void setCongresosViejos (ArrayList<Congreso> val) {
        this.mCongresosViejos = val;
    }

public ArrayList<Cliente> getClientesNuevos () {
        return mClientesNuevos;
    }

public void setClientesNuevos (ArrayList<Cliente> val) {
        this.mClientesNuevos = val;
    }
public ArrayList<Cliente> getClientesViejos () {
        return mClientesViejos;
    }

public void setClientesViejos (ArrayList<Cliente> val) {
        this.mClientesViejos = val;
    }

public ArrayList<Pedido> getPedidosNuevos () {
        return mPedidosNuevos;
    }

public void setPedidosNuevos (ArrayList<Pedido> val) {
        this.mPedidosNuevos = val;
    }

public ArrayList<Pedido> getPedidosViejos () {
        return mPedidosViejos;
    }

public void setPedidosViejos (ArrayList<Pedido> val) {
        this.mPedidosViejos = val;
    }

public void cargarClientesViejos () {
        this.setClientesViejos(Facade.obtenerClientesNuevos());
    } 

public void cargarClientesNuevos(){
        this.setClientesNuevos(Facade.obtenerClientesNuevos());
}

public  void cargarCongresosNuevos(View.Porcentaje porcentaje){
      
        this.setCongresosNuevos(Facade.obtenerCongresosNuevos());
        
        float porc_aux=porcentaje.getValor();
        float aux=this.mCongresosNuevos.size()+1;
        float porcentaje_fracc=30/aux;
        
        for(int i=0;i<this.mCongresosNuevos.size();i++){
            //calcula porcentaje hecho
            porc_aux=porc_aux+porcentaje_fracc;
            porcentaje.setValor(Math.round(porc_aux));
            Thread.yield();
            
          this.mCongresosNuevos.get(i).setPedido(Facade.obtenerPedidos(this.mCongresosNuevos.get(i)));
           try{ for (int j=0;j<this.mCongresosNuevos.get(i).getPedido().size();j++){
                this.mCongresosNuevos.get(i).getPedido().get(j).setCongreso(mCongresosNuevos.get(i));
            }}catch(Exception e){e.printStackTrace();  }
            this.mCongresosNuevos.get(i).setCaja(Facade.obtenerCaja(this.mCongresosNuevos.get(i)));
						
				
        }
        //this.mCongresosNuevos.remove(this.mCongresosNuevos.size()-1);   
    }

public void cargarCongresosViejos(){
        this.setCongresosViejos(Facade.obtenerCongresosViejos());
       /* for(int i=0;i<this.mCongresosViejos.size();i++){
            this.mCongresosViejos.get(i).setPedido(Proxy.obtenerPedidos(this.mCongresosViejos.get(i)));
            for (int j=0;j<this.mCongresosViejos.get(i).getPedido().size();j++){
                this.mCongresosViejos.get(i).getPedido().get(j).setCongreso(mCongresosViejos.get(i));
            }
                this.mCongresosViejos.get(i).setCaja(Proxy.obtenerCaja(this.mCongresosViejos.get(i)));
						
				
        }*/
        //this.mCongresosViejos.remove(this.mCongresosViejos.size()-1);
}
public void agregarCongresos(View.Porcentaje porcentaje){
    int contadorPedido=0;
    int contadorCongreso=0;
    float porc_aux=porcentaje.getValor();
    float aux=this.mCongresosNuevos.size()+1;
    float porcentaje_fracc=40/aux;
    //recorre todo el vector con los congresos nuevos
    for(int i=0;i<this.mCongresosNuevos.size();i++){
        porc_aux=porc_aux+porcentaje_fracc;
        porcentaje.setValor(Math.round(porc_aux));
        Thread.yield();
        //Recorre todos los congresos viejos
        for (int j=0;j<this.mCongresosViejos.size();j++){
            //Si la fecha de los congresos es la misma entra
            if (this.mCongresosNuevos.get(i).getFechaInicio().compareTo(this.mCongresosViejos.get(j).getFechaInicio())==0){
                //Si las iniciales del congreso viejo y el nuevo son iguales entra
                if(this.mCongresosNuevos.get(i).getIniciales().compareTo(this.mCongresosViejos.get(j).getIniciales())==0){
                    // ArrayList<Pedido> listado = this.mCongresosNuevos.get(i).getPedido();
                     contadorCongreso = contadorCongreso + 1 ;
                     
                    //Si el congreso tiene algun pedido entra y sino no
                    if(this.mCongresosNuevos.get(i).getPedido().size()>0){
                        //Solo carga los pedidos si hay coincidencia con los congresos nuevos
                        this.mCongresosViejos.get(j).setPedido(Facade.obtenerPedidos(this.mCongresosViejos.get(j)));
                        for (int z=0;z<this.mCongresosViejos.get(j).getPedido().size();z++){
                             this.mCongresosViejos.get(j).getPedido().get(z).setCongreso(mCongresosViejos.get(j));
                        }
                        this.mCongresosViejos.get(j).setCaja(Facade.obtenerCaja(this.mCongresosViejos.get(i)));
                        
                        //Recorre el vector de gastos nuevos
                        ArrayList<Gasto> gastos_nuevos=this.mCongresosNuevos.get(i).getCaja().getGasto();
                        ArrayList<Gasto> gastos_viejos=this.mCongresosViejos.get(j).getCaja().getGasto();
                        for (int k=0;k<gastos_nuevos.size();k++){
                            int contadorGasto=0;
                            for (int l=0;l<gastos_viejos.size();l++){
                                if((gastos_nuevos.get(k).getFecha().compareTo(gastos_viejos.get(l).getFecha())==0)&&(gastos_nuevos.get(k).getDescripcion().compareTo(gastos_viejos.get(l).getDescripcion())==0)){
                                    contadorGasto=1;
                                    gastos_viejos.remove(l); //como encontro su pareja lo remueve
                                    break;        
                                }
                            }
                            //si no encontro al gasto lo agrega
                            if (contadorGasto==0)
                                Facade.modificarGasto(mCongresosNuevos.get(i), gastos_nuevos.get(k));
                        }
                        
                        //Recorre el vector de todos los pedidos nuevos del congreso en accion
                        for (int k=0;k<this.mCongresosNuevos.get(i).getPedido().size();k++){
                            //Recorre todo el vector de congresos viejos comparando con los nuevos
                            for (int l=0;l<this.mCongresosViejos.get(j).getPedido().size();l++){
                                //Si el cliente del pedido es igual al que se compara entra
                                //System.out.println(this.mCongresosViejos.get(j).getPedido().get(l).getFecha());
                                //if(this.mCongresosNuevos.get(i).getPedido().get(k).getCliente().getIdCli()==this.mCongresosViejos.get(j).getPedido().get(l).getCliente().getIdCli()){
                                    //Si la fecha del pedido nuevo es igual a la del pedido viejo entra
                                    if (this.mCongresosNuevos.get(i).getPedido().get(k).getFecha().compareTo(this.mCongresosViejos.get(j).getPedido().get(l).getFecha())==0){
                                        //no hace nada porque son iguales
                                        contadorPedido = 1;
                                        //mCongresosViejos.get(j).getPedido().remove(l); //como encontro su pareja lo remueve
                                        break;
                                    }
                                //}

                            }
                            if (contadorPedido==0){
                                Facade.almacenarPedido(this.mCongresosNuevos.get(i).getPedido().get(k));  
                            }
                            contadorPedido = 0;
                        }
                }
                }
            } 
            //si la fecha es mayor, es porque no existe en la base vieja
            if (this.mCongresosNuevos.get(i).getFechaInicio().compareTo(this.mCongresosViejos.get(j).getFechaInicio())>0)
                break;
        }
        //si el congreso no existe carga todo
        if (contadorCongreso==0){
            ArrayList<Gasto> gastos = this.mCongresosNuevos.get(i).getCaja().getGasto();
            ArrayList<Pedido> pedidos = this.mCongresosNuevos.get(i).getPedido();
            Facade.almacenarCongreso(this.mCongresosNuevos.get(i));
            for (int n=0;n<gastos.size();n++)
                Facade.modificarGasto(this.mCongresosNuevos.get(i), gastos.get(n));
            for (int n=0;n<pedidos.size();n++)
                Facade.almacenarPedido(pedidos.get(n));
        }
        contadorCongreso=0;
    }
}
/*
public void agregarClientes () {
    int idMasGrandeAntes =0;
    int idMasGrandeDespues = 0;
    for (int i=0;i<this.mClientesNuevos.size();i++){
        System.out.println("otro cliente agregado");
        if(this.mClientesNuevos.get(i).getFechaNac()==null){
            this.mClientesNuevos.get(i).setFechaNac("");
        }
        if(this.mClientesNuevos.get(i).getMail()==null){
            this.mClientesNuevos.get(i).setMail("");
        }
        if(this.mClientesNuevos.get(i).getApellidoCli()==null){
            this.mClientesNuevos.get(i).setApellidoCli("");
        }
        if(this.mClientesNuevos.get(i).getDireccion()==null){
            this.mClientesNuevos.get(i).setDireccion("");
        }
        if(this.mClientesNuevos.get(i).getMatricula()==null){
            this.mClientesNuevos.get(i).setMatricula("");
        }
        if(this.mClientesNuevos.get(i).getNombreCli()==null){
            this.mClientesNuevos.get(i).setNombreCli("");
        }
        if(this.mClientesNuevos.get(i).getNroDocumento()==null){
            this.mClientesNuevos.get(i).setNroDocumento("");
        }
        if(this.mClientesNuevos.get(i).getTelFijo()==null){
            this.mClientesNuevos.get(i).setTelFijo("");
        }
        if(this.mClientesNuevos.get(i).getTelMovil()==null){
            this.mClientesNuevos.get(i).setTelMovil("");
        }
        idMasGrandeAntes=0;
        idMasGrandeDespues=0;
        for (int j=0;j<this.mClientesViejos.size();j++){
            if (this.mClientesViejos.get(j).getIdCli()>idMasGrandeAntes){
                idMasGrandeAntes = this.mClientesViejos.get(j).getIdCli();
            }
        }
        Proxy.almacenarCliente(this.mClientesNuevos.get(i));
        for (int j=0;j<this.mClientesViejos.size();j++){
            if (this.mClientesViejos.get(j).getIdCli()>idMasGrandeDespues){
                idMasGrandeDespues = this.mClientesViejos.get(j).getIdCli();
            }
        }
        if (idMasGrandeAntes < idMasGrandeDespues){
            for (int k=0;k<this.mCongresosNuevos.size();k++){
                for (int l=0;l<this.mCongresosNuevos.get(k).getPedido().size();l++){
                    if(this.mCongresosNuevos.get(k).getPedido().get(l).getCliente().getIdCli()==this.mClientesNuevos.get(i).getIdCli()){
                        this.mCongresosNuevos.get(k).getPedido().get(l).getCliente().setIdCli(idMasGrandeDespues);
                    }
            }
            }
            this.mClientesNuevos.get(i).setIdCli(idMasGrandeDespues);
        }
        
    }
    }
 * */

    //Hace una copia del archivo desde src hasta dst
public int copy(File src, File dst) throws IOException {
        try{
        InputStream in = new FileInputStream(src);
        OutputStream out = new FileOutputStream(dst);
        
        
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
        return 1;
    }catch(Exception e){
        System.out.println("cacheo un error");
        return 0;
    }
}
}